# views 路由 + 视图函数

from flask import Blueprint, request, render_template, jsonify, make_response, Response, redirect, url_for

# 蓝图 需要到__init__.py当中绑定blue
blue = Blueprint('user', __name__)


@blue.route('/')
def index():
    return 'index'


# 请求和响应
# request: 请求
# response: 响应

# http 一次前后端交互: 先请求后响应
# request对象参数
# url  完整请求地址
# base_url 去掉GET参数的url
# host_url 只有主机和端口号的url
# path 路由中的路径
# method 请求方法
# remote_addr 请求的客户端地址
# args GET的请求参数
# form POST的请求参数
# files 文件上传
# headers 请求头
# cookies 请求中的cookie

# request: 客户端服务器发送的请求
@blue.route('/request/', methods=['GET', 'POST'])
def get_request():
    pass
    # print(request)
    # print(request.method)
    # GET请求的参数
    # ImmutableMultiDict: 类似字典对象，区别是可以出现重复的key
    # print(request.args)
    # ImmutableMultiDict取值方式
    # print(request.args['name']), request.args['age']
    # print(request.args.get('name'))
    # print(request.args.getlist('name'))

    # POST请求的参数
    # print(request.form)
    # print(request.form.get('name'), request.form.get('age'))

    # cookie请求
    print(request.cookies)

    # 路径
    print(request.path)  # 路由 /request/
    print(request.url)  # 完整路由 http://127.0.0.1:5000/request/?name=lisi&age=33
    print(request.base_url)  # 去除参数的路由 http://127.0.0.1:5000/request/
    print(request.host_url)  # 去除参数和路径的路由 http://127.0.0.1:5000/
    print(request.remote_addr)  # 客户端的IP
    print(request.files)  # 文件内容 ImmutableMultiDict([])
    print(request.headers)  # 请求头
    print(request.user_agent)  # 用户代理，包括浏览器和操作系统的信息

    return 'request ok'


# 响应
@blue.route('/response/')
def get_response():
    pass
    # 响应的几种方式
    # 1. 字符串（不常用）
    # return 'response ok'
    # 2. 模版渲染（前后端不分离)
    # return render_template('home.html', name='张三', age=18)
    # 3. 返回JSON数据(前后端分离)
    # data = {'name': '李四', 'age': 18}
    # return data
    # jsonify()：序列化，字典=>字符串
    # return jsonify(data)
    # 4. 自定义 response对象
    html = render_template('home.html', name='张三', age=18)
    print(html, type(html)) # <class 'str'>

    # res = make_response(html, 200)
    res = Response(html)
    return res

# 重定向 Redirect
@blue.route('/redirect/')
def make_redirect():
    pass
    # 重定向的几种方式
    # return redirect('https://www.qq.com')
    # return redirect('/response/')

    # 反向解析
    # url_for('蓝图名称.视图函数名')
    # ret = url_for('user.get_response')
    # print('ret:', ret)  # 通过视图函数名反过来找到路由  /response/
    # return redirect(ret)

    # url_for 传参
    ret2 = url_for('user.get_request', name="王五", age=55)
    return redirect(ret2)



